"""
应用程序配置管理
"""
import os
import json
from typing import Dict, Any


class AppConfig:
    """
    应用程序配置类，用于管理全局配置
    """
    
    # 默认配置
    _default_config = {
        "debug": {
            "show_socket_logs": True,  # 是否在UI上显示Socket数据日志
            "verbose_logging": True,   # 是否启用详细日志记录
        },
        "ui": {
            "max_log_entries": 100,    # 日志面板最大显示条数
            "max_table_rows": 100,     # 表格最大行数
        },
        "websocket": {
            "server_port": 8765,       # WebSocket服务器端口
            "server_host": "0.0.0.0",  # WebSocket服务器主机
        },
        "tts": {
            "url": "http://127.0.0.1:8080",  # TTS服务URL
            "timeout": 30,                   # 请求超时时间（秒）
            "check_interval_connected": 30,  # 已连接时的检测间隔（秒）
            "check_interval_disconnected": 5, # 未连接时的检测间隔（秒）
        }
    }
    
    # 单例实例
    _instance = None
    
    @classmethod
    def get_instance(cls):
        """
        获取配置实例（单例模式）
        
        @return: 配置实例
        """
        if cls._instance is None:
            cls._instance = AppConfig()
        return cls._instance
    
    def __init__(self):
        """
        初始化配置
        """
        # 配置文件路径
        self.config_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "config")
        self.config_file = os.path.join(self.config_dir, "app_config.json")
        
        # 确保配置目录存在
        if not os.path.exists(self.config_dir):
            os.makedirs(self.config_dir)
        
        # 加载配置
        self.config = self._load_config()
    
    def _load_config(self) -> Dict[str, Any]:
        """
        加载配置
        
        @return: 配置字典
        """
        # 如果配置文件存在，则从文件加载
        if os.path.exists(self.config_file):
            try:
                with open(self.config_file, 'r', encoding='utf-8') as f:
                    config = json.load(f)
                
                # 合并默认配置和加载的配置
                merged_config = self._default_config.copy()
                self._merge_config(merged_config, config)
                return merged_config
            except Exception as e:
                print(f"加载配置文件失败: {str(e)}")
                return self._default_config.copy()
        else:
            # 如果配置文件不存在，则使用默认配置并保存
            self._save_config(self._default_config)
            return self._default_config.copy()
    
    def _merge_config(self, target, source):
        """
        递归合并配置
        
        @param target: 目标配置
        @param source: 源配置
        """
        for key, value in source.items():
            if key in target and isinstance(target[key], dict) and isinstance(value, dict):
                self._merge_config(target[key], value)
            else:
                target[key] = value
    
    def _save_config(self, config=None) -> bool:
        """
        保存配置
        
        @param config: 要保存的配置，如果为None则保存当前配置
        @return: 是否成功保存
        """
        if config is None:
            config = self.config
        
        try:
            with open(self.config_file, 'w', encoding='utf-8') as f:
                json.dump(config, f, indent=4, ensure_ascii=False)
            return True
        except Exception as e:
            print(f"保存配置文件失败: {str(e)}")
            return False
    
    def get(self, section, key, default=None):
        """
        获取配置值
        
        @param section: 配置节
        @param key: 配置键
        @param default: 默认值
        @return: 配置值
        """
        try:
            return self.config[section][key]
        except (KeyError, TypeError):
            return default
    
    def set(self, section, key, value) -> bool:
        """
        设置配置值
        
        @param section: 配置节
        @param key: 配置键
        @param value: 配置值
        @return: 是否成功设置
        """
        try:
            if section not in self.config:
                self.config[section] = {}
            
            self.config[section][key] = value
            return self._save_config()
        except Exception:
            return False
    
    def save(self) -> bool:
        """
        保存当前配置
        
        @return: 是否成功保存
        """
        return self._save_config(self.config)
    
    def reload(self) -> bool:
        """
        重新加载配置
        
        @return: 是否成功重新加载
        """
        try:
            self.config = self._load_config()
            return True
        except Exception as e:
            print(f"重新加载配置失败: {str(e)}")
            return False
    
    def reset(self) -> bool:
        """
        重置为默认配置
        
        @return: 是否成功重置
        """
        self.config = self._default_config.copy()
        return self._save_config()
    
    def is_debug_enabled(self) -> bool:
        """
        检查是否启用调试模式
        
        @return: 是否启用调试模式
        """
        return self.get("debug", "show_socket_logs", True)
    
    def set_debug_enabled(self, enabled: bool) -> bool:
        """
        设置是否启用调试模式
        
        @param enabled: 是否启用
        @return: 是否成功设置
        """
        return self.set("debug", "show_socket_logs", enabled) 